package com.leslie.hhcommunity.event;

import com.alibaba.fastjson.JSONObject;
import com.leslie.hhcommunity.entity.DiscussPost;
import com.leslie.hhcommunity.entity.Event;
import com.leslie.hhcommunity.entity.Message;
import com.leslie.hhcommunity.service.DiscussPostService;
import com.leslie.hhcommunity.service.ElasticSearchService;
import com.leslie.hhcommunity.service.MessageService;
import com.leslie.hhcommunity.util.CommunityConstant;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author
 * @PackageName:com.leslie.hhcommunity.event
 * @ClassnName:EventConsumer
 * @Description: 事件消费者
 * @Date 2022/1/7  21:25
 */
@Component
public class EventConsumer implements CommunityConstant {

	private static final Logger logger = LoggerFactory.getLogger(EventConsumer.class);

	@Autowired
	MessageService messageService;
	@Autowired
	private DiscussPostService discussPostService;
	@Autowired
	private ElasticSearchService elasticsearchService;

	/**
	 * 消费评论，点赞，关注事件
	 * @param record 接收消息队列中的消息
	 */
	@KafkaListener(topics = {TOPIC_COMMENT,TOPIC_LIKE,TOPIC_FOLLOW})
	public void handleCommentMessage(ConsumerRecord record){
		if (record == null || record.value() == null){
			logger.error("消息内容为空");
			return;
		}
		Event event = JSONObject.parseObject(record.value().toString(), Event.class);
		if (event == null) {
			logger.error("消息格式错误！");
			return;
		}
		//发送站内通知
		Message message = new Message();
		message.setFromId(SYSTEM_USER_ID);
		message.setToId(event.getEntityUserId());
		message.setConversationId(event.getTopic());
		message.setCreateTime(new Date());

		Map<String, Object> content = new HashMap<>();
		content.put("userId", event.getUserId());
		content.put("entityType", event.getEntityType());
		content.put("entityId", event.getEntityId());

		if (event.getData() != null){
			for (Map.Entry<String, Object> entry : event.getData().entrySet()) {
				content.put(entry.getKey(), entry.getValue());
			}
		}
		message.setContent(JSONObject.toJSONString(content));
		messageService.insertMessage(message);
	}

	/**
	 * 消费发帖事件
	 * @param record
	 */
	@KafkaListener(topics = {TOPIC_PUBLISH})
	public void handlePublishMessage(ConsumerRecord record){
		if (record == null || record.value() == null){
			logger.error("消息内容为空");
			return;

		}
		Event event = JSONObject.parseObject(record.value().toString(), Event.class);
		if (event == null) {
			logger.error("消息格式错误！");
			return;
		}
		//ElasticSearch搜索引擎保存帖子信息
		DiscussPost post = discussPostService.selectDiscussPostById(event.getEntityId());
		elasticsearchService.saveDiscussPost(post);
	}

	// 消费删帖事件
	@KafkaListener(topics = {TOPIC_DELETE})
	public void handleDeleteMessage(ConsumerRecord record) {
		if (record == null || record.value() == null) {
			logger.error("消息的内容为空!");
			return;
		}

		Event event = JSONObject.parseObject(record.value().toString(), Event.class);
		if (event == null) {
			logger.error("消息格式错误!");
			return;
		}

		elasticsearchService.deleteDiscussPost(event.getEntityId());
	}


}
